/**
 * NodeJS 事件队列说明 (🧡代表需要关注的队列)
 *  1-timers 🧡 : 执行 setTimeout 与 setInterval 回调
 *  2-pending callbacks: 执行系统操作的回调, 例如 tcp/udp
 *  3-idle, prepare: 在系统内部进行使用
 *  4-poll  🧡: 执行与 I/O相关的回调
 *  5-check 🧡: 执行 setImmediate 中的回调
 *  6-close callback: 执行 close 事件的回调
 */

/**
 * NodeJS 完整事件环
 *  执行同步代码,将不同的任务添加至相应的队列
 *  所有同步代码执行后会去执行满足条件的微任务
 *  所有微任务代码执行后会执行 timer 队列中满足的宏任务
 *  timer中的所有宏任务执行完成后就会依次切换队列
 *  🎃 注意: 在完成切换之前会先清空微任务代码
 */

setTimeout(() => {
  console.info('s1')
})

Promise.resolve().then(() => {
  console.info('p1')
})

console.info('start')

// NodeJS 平台下自带的微任务
process.nextTick(() => {
  console.info('tick')
})

setImmediate(() => {
  console.info('immediate')
})

console.info('end')

// nextTick 的优先级高于 Promise.then(), 先输出 tick
// start => end => tick => p1  => s1 => immediate
